package com.eec.AOP.createProxyObject;

import com.eec.AOP.Chain;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class JDKProxyObject {
    public Object createProxyObject(Object obj) {
        // 先构建好通用责任链 整个IOC环境中 有哪些AOP增强代码
        if(Chain.responsibilityChain.isEmpty()){
            Chain.responsibilityChain = Chain.getResponsibilityChain();
        }
        return getObject(obj);
    }
    public Object getObject(Object obj) {
        // 找到对应需要代理的对象
        return Proxy.newProxyInstance(
                // 参数一：类加载器
                obj.getClass().getClassLoader(),
                // 参数二：指定接口，可以有多个，用这些接口指定代理的方法有哪些
                obj.getClass().getInterfaces(),
                // 参数三：调用处理器，代理对象中的方法被调用，都会在执行方法
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        Method implMethod = getImplementationMethod(obj, method);
                        return new Chain(implMethod, args,obj).proceed();
                    }
                });
    }
    // 根据接口方法查找实现类中对应的方法
    private Method getImplementationMethod(Object obj, Method interfaceMethod) throws NoSuchMethodException {
        // 1. 获取实现类的Class（如TestAAA.class）
        Class<?> implClass = obj.getClass();
        // 2. 获取接口方法的参数类型
        Class<?>[] paramTypes = interfaceMethod.getParameterTypes();
        // 3. 根据方法名和参数类型在实现类中查找对应方法
        return implClass.getMethod(interfaceMethod.getName(), paramTypes);
    }


}